package com.insight.dto.datasource;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.time.LocalDateTime;

/**
 * T031: 连接测试响应DTO
 * 返回数据库连接测试结果
 *
 * @author Insight Team
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class ConnectionTestResponse {

    /**
     * 连接是否成功
     */
    private Boolean success;

    /**
     * 连接响应时间（毫秒）
     */
    private Long responseTimeMs;

    /**
     * 测试时间戳
     */
    private LocalDateTime testedAt;

    /**
     * 成功消息
     */
    private String message;

    /**
     * 错误消息（如果失败）
     */
    private String errorMessage;

    /**
     * 错误详情（如果失败）
     */
    private String errorDetails;

    /**
     * 数据库版本信息（如果成功）
     */
    private String databaseVersion;

    /**
     * 数据库产品名称（如果成功）
     */
    private String databaseProductName;

    /**
     * JDBC驱动版本（如果成功）
     */
    private String driverVersion;

    /**
     * 创建成功的连接测试响应
     *
     * @param responseTimeMs 响应时间
     * @param dbVersion      数据库版本
     * @param dbProduct      数据库产品名称
     * @param driverVersion  驱动版本
     * @return 成功响应
     */
    public static ConnectionTestResponse success(Long responseTimeMs, String dbVersion, String dbProduct, String driverVersion) {
        return ConnectionTestResponse.builder()
                .success(true)
                .responseTimeMs(responseTimeMs)
                .testedAt(LocalDateTime.now())
                .message("连接测试成功")
                .databaseVersion(dbVersion)
                .databaseProductName(dbProduct)
                .driverVersion(driverVersion)
                .build();
    }

    /**
     * 创建失败的连接测试响应
     *
     * @param errorMessage 错误消息
     * @param errorDetails 错误详情
     * @return 失败响应
     */
    public static ConnectionTestResponse failure(String errorMessage, String errorDetails) {
        return ConnectionTestResponse.builder()
                .success(false)
                .testedAt(LocalDateTime.now())
                .message("连接测试失败")
                .errorMessage(errorMessage)
                .errorDetails(errorDetails)
                .build();
    }
}
